#ifndef FILEPROCESSINGTASK_H
#define FILEPROCESSINGTASK_H

#include "itask.h"
#include <QString>
#include <QObject>
#include <QMutex>
#include <functional>
#include "imageprocessor.h"

/**
 * @brief 文件处理任务
 * 
 * 实现ITask接口，负责处理单个文件的缓存生成
 * 支持进度回调和取消操作
 */
class FileProcessingTask : public QObject, public ITask {
    Q_OBJECT
    
public:
    /**
     * @brief 构造函数
     * @param filePath 文件路径
     * @param cacheDir 缓存目录
     * @param fileIndex 文件索引（用于UI更新）
     * @param parent QObject父对象
     */
    explicit FileProcessingTask(const QString& filePath, 
                               const QString& cacheDir,
                               int fileIndex = -1,
                               QObject* parent = nullptr);
    
    ~FileProcessingTask() override;
    
    // ITask接口实现
    void execute() override;
    QString getTaskId() const override { return m_taskId; }
    int getPriority() const override { return m_priority; }
    qint64 getEstimatedMemory() const override { return m_estimatedMemory; }
    qint64 getEstimatedDuration() const override { return m_estimatedDuration; }
    bool isCancellable() const override { return true; }
    void cancel() override;
    QString getTaskType() const override { return "FileProcessing"; }
    
    /**
     * @brief 设置任务优先级
     * @param priority 优先级值
     */
    void setPriority(int priority) { m_priority = priority; }
    
    /**
     * @brief 设置进度回调函数
     * @param callback 回调函数
     */
    void setProgressCallback(std::function<void(int, const QString&)> callback);
    
    /**
     * @brief 设置完成回调函数
     * @param callback 回调函数
     */
    void setCompletionCallback(std::function<void(bool, const QString&)> callback);
    
    /**
     * @brief 获取文件路径
     * @return 文件路径
     */
    QString getFilePath() const { return m_filePath; }
    
    /**
     * @brief 获取缓存目录
     * @return 缓存目录
     */
    QString getCacheDir() const { return m_cacheDir; }
    
    /**
     * @brief 获取文件索引
     * @return 文件索引
     */
    int getFileIndex() const { return m_fileIndex; }

signals:
    /**
     * @brief 进度更新信号
     * @param taskId 任务ID
     * @param progress 进度百分比
     * @param status 状态描述
     */
    void progressUpdated(const QString& taskId, int progress, const QString& status);
    
    /**
     * @brief 任务完成信号
     * @param taskId 任务ID
     * @param successful 是否成功
     * @param errorMessage 错误信息
     */
    void taskCompleted(const QString& taskId, bool successful, const QString& errorMessage);

private:
    QString m_taskId;              // 任务唯一标识
    QString m_filePath;            // 文件路径
    QString m_cacheDir;            // 缓存目录
    int m_fileIndex;               // 文件索引
    int m_priority;                // 任务优先级
    qint64 m_estimatedMemory;      // 预估内存使用量
    qint64 m_estimatedDuration;    // 预估执行时间
    
    // 取消标志
    bool m_cancelled;
    QMutex m_cancelMutex;
    
    // 回调函数
    std::function<void(int, const QString&)> m_progressCallback;
    std::function<void(bool, const QString&)> m_completionCallback;
    
    // 内部方法
    void updateProgress(int progress, const QString& status);
    void notifyCompletion(bool successful, const QString& errorMessage = QString());
    
    // 具体处理步骤
    bool processFile();

    // Martin Fowler重构：DPI配置获取
    DpiConfiguration getCurrentDpiConfiguration() const;
    bool generatePages();
    bool createThumbnails();
    bool validateResults();
    
    // 工具方法
    QString generateTaskId() const;
    qint64 estimateMemoryUsage(const QString& filePath) const;
    qint64 estimateDuration(const QString& filePath) const;
    bool checkCancellation();
    
    // 文件类型检测
    enum class FileType {
        PDF,
        Image,
        Unknown
    };
    FileType detectFileType(const QString& filePath) const;
    
    // PDF处理
    bool processPdfFile();
    
    // 图片处理
    bool processImageFile();
};

/**
 * @brief 批量文件处理任务
 * 
 * 用于处理多个文件的批量任务
 */
class BatchFileProcessingTask : public QObject, public ITask {
    Q_OBJECT
    
public:
    /**
     * @brief 构造函数
     * @param filePaths 文件路径列表
     * @param baseCacheDir 基础缓存目录
     * @param parent QObject父对象
     */
    explicit BatchFileProcessingTask(const QStringList& filePaths,
                                   const QString& baseCacheDir,
                                   QObject* parent = nullptr);
    
    ~BatchFileProcessingTask() override;
    
    // ITask接口实现
    void execute() override;
    QString getTaskId() const override { return m_batchId; }
    int getPriority() const override { return 1; } // 批量任务优先级较低
    qint64 getEstimatedMemory() const override;
    qint64 getEstimatedDuration() const override;
    bool isCancellable() const override { return true; }
    void cancel() override;
    QString getTaskType() const override { return "BatchFileProcessing"; }
    
    /**
     * @brief 设置进度回调函数
     * @param callback 回调函数
     */
    void setProgressCallback(std::function<void(int, const QString&)> callback);
    
    /**
     * @brief 设置完成回调函数
     * @param callback 回调函数
     */
    void setCompletionCallback(std::function<void(bool, const QString&)> callback);

signals:
    /**
     * @brief 进度更新信号
     * @param taskId 任务ID
     * @param progress 进度百分比
     * @param status 状态描述
     */
    void progressUpdated(const QString& taskId, int progress, const QString& status);
    
    /**
     * @brief 任务完成信号
     * @param taskId 任务ID
     * @param successful 是否成功
     * @param errorMessage 错误信息
     */
    void taskCompleted(const QString& taskId, bool successful, const QString& errorMessage);

private:
    QString m_batchId;             // 批量任务ID
    QStringList m_filePaths;       // 文件路径列表
    QString m_baseCacheDir;        // 基础缓存目录
    
    // 取消标志
    bool m_cancelled;
    QMutex m_cancelMutex;
    
    // 回调函数
    std::function<void(int, const QString&)> m_progressCallback;
    std::function<void(bool, const QString&)> m_completionCallback;
    
    // 内部方法
    void updateProgress(int progress, const QString& status);
    void notifyCompletion(bool successful, const QString& errorMessage = QString());
    bool processBatch();
    bool checkCancellation();
    QString generateBatchId() const;
};

#endif // FILEPROCESSINGTASK_H
